// 引入必要的库
#include <ESP8266WiFi.h>      // ESP8266 WiFi功能库
#include <ESP8266WebServer.h> // ESP8266 Web服务器库

// WiFi网络配置
const char* ssid = "xxx";     // WiFi名称
const char* password = "xxx"; // WiFi密码

// 创建Web服务器实例，监听80端口
ESP8266WebServer server(80);

// 继电器控制引脚和状态变量
const int relayPin = 4;     // 继电器连接在GPIO4引脚
bool lightState = false;    // 灯的当前状态
bool wifiConnected = false; // 记录WiFi连接状态

void setup() {
  // 初始化串口通信，波特率9600
  Serial.begin(9600);
  
  // 设置继电器引脚为输出模式
  pinMode(relayPin, OUTPUT);
  // 初始状态关闭继电器(根据实际继电器逻辑可能需要调整LOW/HIGH)
  digitalWrite(relayPin, LOW);

  // 连接WiFi
  WiFi.begin(ssid, password);
  Serial.println("正在连接WiFi...");
  
  // 等待WiFi连接成功
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  // WiFi连接成功后打印信息
  Serial.println("");
  Serial.println("WiFi连接成功");
  Serial.println("IP地址: ");
  Serial.println(WiFi.localIP()); // 打印ESP8266的本地IP地址

  // 连接成功后闪烁LED灯2次，每次80毫秒
  blinkLight(2, 80);

  // 设置Web服务器路由和处理函数
  server.on("/", handleRoot);      // 根路径，返回控制页面
  server.on("/on", handleOn);      // 开灯路径
  server.on("/off", handleOff);    // 关灯路径
  server.on("/toggle", handleToggle); // 切换灯状态路径
  server.on("/status", handleStatus); // 获取灯状态路径
  
  // 启动Web服务器
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  // 处理客户端请求
  server.handleClient();
  
  // 检测WiFi状态，如果断开并重新连接，则闪烁灯
  if (WiFi.status() == WL_CONNECTED) {
    if (!wifiConnected) {
      wifiConnected = true;
      Serial.println("WiFi已断开");
      blinkLight(2, 80);  // 重新连接时闪烁2次
    }
  } else {
    wifiConnected = false;  // WiFi断开
  }
}

// LED闪烁函数
void blinkLight(int times, int delayTime) {
  for (int i = 0; i < times; i++) {
    digitalWrite(relayPin, HIGH); // 开灯
    delay(delayTime);
    digitalWrite(relayPin, LOW);  // 关灯
    delay(delayTime);
  }
}

// 根路径处理函数 - 返回HTML控制页面
void handleRoot() {
  // 构建HTML页面
  String html = "<!DOCTYPE html><html><head><title>WiFi灯控制</title>";
  html += "<meta charset='UTF-8'>"; // 设置字符编码为UTF-8
  html += "<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no'>";
  html += "<style>";
  html += "body { font-family: Arial, sans-serif; text-align: center; margin: 0; padding: 20px; }";
  html += "h1 { margin-top: 20px; }";
  html += ".btn-container { display: flex; flex-direction: column; align-items: center; }";
  html += "button { padding: 12px 24px; font-size: 18px; margin: 8px; width: 80%; max-width: 300px; border: none; border-radius: 5px; }";
  html += ".on { background-color: #4CAF50; color: white; }";    // 开灯按钮绿色
  html += ".off { background-color: #f44336; color: white; }";   // 关灯按钮红色
  html += ".toggle { background-color: #2196F3; color: white; }";// 切换按钮蓝色
  html += ".status { font-size: 20px; margin: 15px 0; font-weight: bold; }";
  html += "</style>";
  html += "</head><body>";
  html += "<h1>WiFi灯控制</h1>";
  html += "<div class='status'>当前状态: " + String(lightState ? "开" : "关") + "</div>";
  html += "<div class='btn-container'>";
  html += "<button class='on' onclick=\"controlLight('on')\">开灯</button>";
  html += "<button class='off' onclick=\"controlLight('off')\">关灯</button>";
  html += "</div>";
  html += "<script>";
  html += "function controlLight(cmd) {";
  html += "  fetch('/' + cmd)";  // 发送请求到对应路径
  html += "    .then(response => response.text())";
  html += "    .then(text => {";
  html += "      location.reload();";  // 刷新页面更新状态
  html += "    })";
  html += "    .catch(err => console.error('Error:', err));";
  html += "}";
  html += "</script>";
  html += "</body></html>";
  
  // 发送HTML页面，明确指定内容类型和编码
  server.send(200, "text/html; charset=utf-8", html);
}

// 开灯处理函数
void handleOn() {
  digitalWrite(relayPin, HIGH); // 打开继电器
  lightState = true;            // 更新状态
  server.send(200, "text/plain"); // 返回成功响应
}

// 关灯处理函数
void handleOff() {
  digitalWrite(relayPin, LOW);  // 关闭继电器
  lightState = false;           // 更新状态
  server.send(200, "text/plain"); // 返回成功响应
}

// 切换灯状态处理函数
void handleToggle() {
  lightState = !lightState; // 切换状态
  digitalWrite(relayPin, lightState ? LOW : HIGH); // 根据状态控制继电器
  server.send(200, "text/plain", lightState ? "灯已打开" : "灯已关闭");
}

// 获取灯状态处理函数
void handleStatus() {
  server.send(200, "text/plain", lightState ? "on" : "off");
}